PROG = app
FLAGS = -Wall -std=c++17 -O3

OBJS = main.o flex.o bison.o TO_AST.o ASTnode.o SymbolTable.o Quadruples.o
CC = gcc
CXX = g++
LEX = flex
YACC = bison

$(PROG) : $(OBJS)
	$(CXX) $(FLAGS) $(OBJS) -o $(PROG)

main.o : main.cpp TO_AST.h ASTnode.h Quadruples.h
	$(CXX) -c main.cpp

flex.o : flex.l
	$(LEX) flex.l
	mv lex.yy.c lex.yy.cpp
	$(CXX) -o flex.o -c lex.yy.cpp

bison.o : yacc.y compile.h
	$(YACC) --yacc -dv --debug yacc.y
	mv y.tab.c y.tab.cpp
	$(CXX) -o bison.o -c y.tab.cpp

TO_AST.o : TO_AST.cpp TO_AST.h ASTnode.h
	$(CXX) -c TO_AST.cpp

ASTnode.o : ASTnode.cpp ASTnode.h
	$(CXX) -c ASTnode.cpp

SymbolTable.o : SymbolTable.cpp SymbolTable.h
	$(CXX) -c SymbolTable.cpp

Quadruples.o : Quadruples.cpp Quadruples.h TO_AST.h
	$(CXX) -c Quadruples.cpp

clean :
	rm $(PROG) $(OBJS) lex.yy.cpp y.tab.cpp
	[ -d out ] && rm -rf out

test :
	bash ./test.sh